﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;

namespace LM.Negocio.Validadores
{
    public class ValidadorTipoDeVeiculo : ValidadorAbastrato
    {
        private TipoDeVeiculo _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<TipoDeVeiculo> _repositorioDeTipoDeVeiculo;


        public ValidadorTipoDeVeiculo(IRepositorioDeConsultaDeObjetos<TipoDeVeiculo> repositorioDeTipoDeVeiculo)
        {
            if (repositorioDeTipoDeVeiculo == null)
            {
                throw new ArgumentNullException("repositorioDeTipoDeVeiculo");
            }

            _repositorioDeTipoDeVeiculo = repositorioDeTipoDeVeiculo;
        }

        public void ValideCadastro(TipoDeVeiculo tipoVeiculo)
        {
            if (tipoVeiculo == null)
            {
                throw new ArgumentException("TipoDeVeiculo");
            }

            _objetoValidado = tipoVeiculo;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideDescricaoNaoInformada();
            ValideTipoVeiculoJaCadastrado();

            base.GarantaSucesso();
        }


        public void ValideAtualizacao(TipoDeVeiculo tipoVeiculo)
        {
            if (tipoVeiculo == null)
            {
                throw new ArgumentException("tipoVeiculo");
            }

            _objetoValidado = tipoVeiculo;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideDescricaoNaoInformada();
            ValideTipoDeVeiculoNaoCadastrado();

            base.GarantaSucesso();
        }

        public void ValideExclusao(TipoDeVeiculo tipoDeVeiculo)
        {
            if (tipoDeVeiculo == null)
            {
                throw new ArgumentException("TipoDeVeiculo");
            }

            _objetoValidado = tipoDeVeiculo;
            base.LimpeInconsistencias();

            ValideTipoDeVeiculoNaoCadastrado();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if (_objetoValidado.Codigo == 0)
            {
                AdicioneInconsistencia("Código não informado.");
            }
        }

        private void ValideDescricaoNaoInformada()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Descricao))
            {
                AdicioneInconsistencia("Descrição não informada.");
            }
        }

        private bool TipoDeVeiculoJaCadastrado()
        {
            return _repositorioDeTipoDeVeiculo.Consulte(m => m.Codigo == _objetoValidado.Codigo).Any();
        }

        private void ValideTipoVeiculoJaCadastrado()
        {
            if (TipoDeVeiculoJaCadastrado())
            {
                AdicioneInconsistencia("Já existe um tipo cadastrado com o código {0}.", _objetoValidado.Codigo);
            }
        }

        private void ValideTipoDeVeiculoNaoCadastrado()
        {
            if (!TipoDeVeiculoJaCadastrado())
            {
                AdicioneInconsistencia("Tipo de Veiculo com o código {0} não cadastrado.", _objetoValidado.Codigo);
            }
        }
    }
}
